package br.ufes.ceunes.poo.model.DAO;


import br.ufes.ceunes.poo.model.pojo.Cliente;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;


import javax.swing.JOptionPane;

public class ClienteDAO {

    private final String arquivo = "cliente.txt";
    private int idCliente = 0;
    private ArrayList<Cliente> clientes=null;
    private static ClienteDAO instancia = null;
    
    public static synchronized ClienteDAO getIntancia(){
        if(instancia == null){
            instancia = new ClienteDAO();
        }
        return instancia;
    } 
    
    public void gravarArquivoCliente() {
        
        try {
            File arquivo1 = new File(arquivo);
            try (FileOutputStream fos = new FileOutputStream(arquivo1)) {
                String texto = idCliente + "\r\n";
                fos.write(texto.getBytes());
                texto = this.clientes.size() + "\r\n";
                fos.write(texto.getBytes());
                texto = "\r\n";
                for (int i = 0; i < this.clientes.size(); i++) {
                    fos.write(this.clientes.get(i).getNome().getBytes());
                    fos.write(texto.getBytes());
                    fos.write(this.clientes.get(i).getEndereco().getBytes());
                    fos.write(texto.getBytes());
                    fos.write(this.clientes.get(i).getCpf().getBytes());
                    fos.write(texto.getBytes());
                    texto = this.clientes.get(i).getIdCliente() + "";
                    fos.write(texto.getBytes());
                    texto = "\r\n";
                    fos.write(texto.getBytes());
                    
                }
                fos.close();
            }
        } catch (IOException ee) {
            System.out.println("Erro ao salvar arquivo em " + arquivo);
        }
    }

    public void lerArquivo() {
        int i, qt;
        String nome, endereco, cpf, id;
        Scanner sc;
        try {
            sc = new Scanner(new FileReader(new File(arquivo)));
            while (sc.hasNext()) {
                String valor = sc.nextLine();
                this.idCliente = Integer.parseInt(valor);
                valor = sc.nextLine();
                qt = Integer.parseInt(valor);
                for (i = 0; i < qt; i++) {
                    nome = sc.nextLine();
                    endereco = sc.nextLine();
                    cpf = sc.nextLine();
                    id = sc.nextLine();
                    adicionarClienteArquivo(nome, endereco, cpf, Integer.parseInt(id));
                }
            }
        } catch (FileNotFoundException e) {
            try {
                File file = new File("arquivo");
                boolean success = file.createNewFile();
                if (success) {
                } else {
                }
            } catch (IOException ee) {
                JOptionPane.showMessageDialog(null, "Erro ao Criar " + arquivo);
            }
        }
    }

    public void adicionarClienteArquivo(String nome, String en, String cpf, int id) {
        Cliente c1 = new Cliente();
        c1.setNome(nome);
        c1.setEndereco(en);
        c1.setCpf(cpf);
        c1.setIdCliente(id);
        this.clientes.add(c1);
    }

    /**
     *
     */
    public ClienteDAO() {
        this.clientes = new ArrayList<Cliente>();
    }
    
    public boolean cadastrarCliente(Cliente c){
        this.idCliente++;
        c.setIdCliente(this.idCliente);
        boolean add = this.clientes.add(c);
        return true;
    }

    public int verExisteCpf(String cpf) {
        for (int i = 0; i < this.clientes.size(); i++) {
            if (cpf.equals(this.clientes.get(i).getCpf())) {
            } else {
                return 1;
            }
        }
        return 0;
    }

    public int verExisteNome(String nome) {
        int i;
        for (i = 0; i < this.clientes.size(); i++) {
            if (nome.equals(this.clientes.get(i).getNome())) {
                return 1;
            }
        }
        return 0;
    }

    /**
     *
     * @param nome
     * @return Cliente
     */
    public Cliente acharClienteNome(String nome) {
        for (int i = 0; i < this.clientes.size(); i++) {
            if (nome.equals(this.clientes.get(i).getNome())) {
                return this.clientes.get(i);
            }
        }
        return null;
    }

    public Cliente acharClienteCpf(String cpf) {
        for (int i = 0; i <this.clientes.size(); i++) {
            if (cpf.equals(this.clientes.get(i).getCpf())) {
                return this.clientes.get(i);
            }
        }
        return null;
    }

    public ArrayList<Cliente> getClientes() {
        return this.clientes;
    }

}
